package com.herench.bs.transfer;

import org.apache.cxf.endpoint.Client;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 复印病历预约
 *
 * @author liuxiaohui
 * @date 2019/3/26
 */
public class DoAppointMedPrintTransfer extends AbstractTransfer {
    public DoAppointMedPrintTransfer(String method, Client client, String messageMethod) {
        super(method, client, messageMethod);
    }

    // 微信公众号注册手机号：微信消息推送用
    public String wxUserMobile = "";
    // 患者姓名：微信消息推送用
    public String patientName = "";

    /**
     * 发送：微信前端JSON数据转换为HIS用的XML数据（微信前端==》HIS）
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public String toInvokeMessage(Map<String, Object> params) throws Exception {
        // 住院号
        String inpNo = (String) params.get("inpNo");
        // 入院次数
        String visitId = (String) params.get("visitId");
        // 患者姓名
        patientName = (String) params.get("patientName");
        // 性别
        String sex = (String) params.get("sex");
        // 身份证号
        String idNo = (String) params.get("idNo");
        // 患者身份证正面照片数据流
        String idCardFrontImage = (String) params.get("idCardFrontImage");
        // 患者身份证背面照片数据流
        String idCardBehindImage = (String) params.get("idCardBehindImage");
        // 代办人姓名
        String agentName = (String) params.get("agentName");
        // 代办人与患者关系
        String agentRelationship = (String) params.get("agentRelationship");
        // 代办人身份证号
        String agentIdNo = (String) params.get("agentIdNo");
        // 代办人身份证正面照片数据流
        String agentIdCardFrontImage = (String) params.get("agentIdCardFrontImage");
        // 代办人身份证背面照片数据流
        String agentIdCardBehindImage = (String) params.get("agentIdCardBehindImage");
        // 代办人电话
        String agentPhoneNumber = (String) params.get("agentPhoneNumber");
        // 病历类型
        String medClass = (String) params.get("medClass");
        // 病历套餐编码(复印用途)
        String medPlanCode = (String) params.get("medPlanCode");
        // 复印用途描述
        String printPurposeDesc = (String) params.get("printPurposeDesc");
        // 复印份数
        String printNum = (String) params.get("printNum");
        // 备注
        String memo = (String) params.get("memo");
        // 领取方式
        String postWay = (String) params.get("postWay");
        // 支付方式
        String payWay = (String) params.get("payWay");
        // 收件人姓名
        String recipientName = (String) params.get("recipientName");
        // 收件人与患者关系
        String relationship = (String) params.get("relationship");
        // 收件地址
        String postAddr = (String) params.get("postAddr");
        // 收件人电话
        String recipientPhoneNumber = (String) params.get("recipientPhoneNumber");
        // 微信公众号注册手机号：微信消息推送用
        wxUserMobile = (String) params.get("wxUserMobile");

        // 交易ID：his的方法名
        Document document = getTplDoc(getMethod());

        // 将各个入参数设值（入参==》XML）
        Element dataRow = document.getRootElement().element("CommitData").addElement("Data").addElement("DataRow");
        // 住院号
        dataRow.addAttribute("INP_NO", inpNo);
        // 入院次数
        dataRow.addAttribute("VISIT_ID", visitId);
        // 患者姓名
        dataRow.addAttribute("PATIENT_NAME", patientName);
        // 性别
        dataRow.addAttribute("SEX", sex);
        // 身份证号
        dataRow.addAttribute("ID_NO", idNo);
        // 患者身份证正面照片数据流
        dataRow.addAttribute("ID_CARD_FRONT_IMAGE", idCardFrontImage);
        // 患者身份证背面照片数据流
        dataRow.addAttribute("ID_CARD_BEHIND_IMAGE", idCardBehindImage);
        // 代办人姓名
        dataRow.addAttribute("AGENT_NAME", agentName);
        // 代办人与患者关系
        dataRow.addAttribute("AGENT_RELATIONSHIP", agentRelationship);
        // 代办人身份证号
        dataRow.addAttribute("AGENT_ID_NO", agentIdNo);
        // 代办人身份证正面照片数据流
        dataRow.addAttribute("AGENT_ID_CARD_FRONT_IMAGE", agentIdCardFrontImage);
        // 代办人身份证背面照片数据流
        dataRow.addAttribute("AGENT_ID_CARD_BEHIND_IMAGE", agentIdCardBehindImage);
        // 代办人电话
        dataRow.addAttribute("AGENT_PHONE_NUMBER", agentPhoneNumber);
        // 病历类型
        dataRow.addAttribute("MED_CLASS", medClass);
        // 病历套餐编码(复印用途)
        dataRow.addAttribute("MED_PLAN_CODE", medPlanCode);
        // 复印用途描述
        dataRow.addAttribute("PRINT_PURPOSE_DESC", printPurposeDesc);
        // 复印份数
        dataRow.addAttribute("PRINT_NUM", printNum);
        // 备注
        dataRow.addAttribute("MEMO", memo);
        // 领取方式
        dataRow.addAttribute("POST_WAY", postWay);
        // 支付方式
        dataRow.addAttribute("PAY_WAY", payWay);
        // 收件人姓名
        dataRow.addAttribute("RECIPIENT_NAME", recipientName);
        // 收件人与患者关系
        dataRow.addAttribute("RELATIONSHIP", relationship);
        // 收件地址
        dataRow.addAttribute("POST_ADDR", postAddr);
        // 收件人电话
        dataRow.addAttribute("RECIPIENT_PHONE_NUMBER", recipientPhoneNumber);

        return document.asXML();
    }

    /**
     * 接收：HIS返回的XML数据并转换为JSON（HIS==》微信前端）
     * @param resMsg
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> toResultMessage(String resMsg) throws Exception {
        Map<String, Object> resMap = new HashMap<>(16);
        Document document = DocumentHelper.parseText(resMsg);

        Element resultInfo = document.getRootElement().element("Result").element("Info");
        String executeStatus = resultInfo.attributeValue("EXECUTE_STATUS");
        String executeMessage = resultInfo.attributeValue("EXECUTE_MESSAGE");

        if (Dialect.getSuccessfulState().equals(executeStatus)) {
            // 获取各个参数的值（出参的树状结构：父==》子）
            Element dataRow = document.getRootElement().element("ReturnData").element("Data").element("DataRow");
            if (dataRow == null) {
                resMap.put("code", "1403");
                resMap.put("message", "调用成功，但是获取的数据为 0 件！");
            } else {
                DoAppointMedPrintInnerMessage innerMessage = new DoAppointMedPrintInnerMessage(dataRow);
                // 复印病历预约ID
                resMap.put("medAppId", innerMessage.getMedAppId());

                // 微信公众号注册手机号：Log 输出用
                resMap.put("wxUserMobile", wxUserMobile);
                // 患者姓名：Log 输出用
                resMap.put("patientName", patientName);

                // 取得系统时间
                Date now = new Date();
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String handleTime = dateFormat.format(now);

                // 处理时间：Log 输出用
                resMap.put("handleTime", handleTime);

                // 返回Code
                resMap.put("code", executeStatus);
                // 返回信息
                resMap.put("message", "成功！");

                // 微信消息推送
                WeiChatSendMsg wxMsg = new WeiChatSendMsg();
                wxMsg.sendMsgDoAppointMedPrint(wxUserMobile, patientName, handleTime);
            }
        } else {
            resMap.put("code", executeStatus);
            resMap.put("message", executeMessage);
        }
        return resMap;
    }

    public class DoAppointMedPrintInnerMessage implements InnerMessage{
        /**
         * 复印病历预约ID
         */
        private String medAppId;



        public DoAppointMedPrintInnerMessage(Element element) {
            // 复印病历预约ID
            this.medAppId = element.attributeValue("MED_APP_ID");

        }

        /**
         * 复印病历预约ID
         */
        public String getMedAppId() {
            return medAppId;
        }


    }
}
